259. Loki上手體驗
WHY
新的服務又掛上去了,
本來想繼續掛EFK給人用,
但看了一下,如果監控的同時可以順便看Log好像也不錯。
監控是grafana,那log只能是 loki了。
Note
先來看一下成果。
1. 部屬 Loki
我是直接從istio(1.21.1),將loki.yaml直接拿出來部屬。
路徑在istio-1.21.1/samples/addons/loki.yaml
github
原本的沒有namespace,需要的自行增加,
否則直接部屬即可。
2. 部屬 Promtail
再來,部屬Promtail將 pod log丟到loki裡面。
k8s的話建議使用 DaemonSet的方法建。
如果想用其他方式,請洽install-promtail
這邊唯一要改的是Loki的位置,
Configmap:promtail-config
底下的 data.clients.url
改為你的loki ip。
建立loki svc時的port為3100,
於是 http://loki.istio-system.svc.cluster.local/loki/api/v1/push
一開始測試時,可以先到任一pod裡面,呼叫 ready的api,
正常的話會回復一個ready的字串。
curl http://loki.istio-system.svc.cluster.local/ready
ref.Loki HTTP API
--- # Daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: promtail-daemonset
spec:
selector:
matchLabels:
name: promtail
template:
metadata:
labels:
name: promtail
spec:
serviceAccount: promtail-serviceaccount
containers:
- name: promtail-container
image: grafana/promtail
args:
- -config.file=/etc/promtail/promtail.yaml
env:
- name: 'HOSTNAME' # needed when using kubernetes_sd_configs
valueFrom:
fieldRef:
fieldPath: 'spec.nodeName'
volumeMounts:
- name: logs
mountPath: /var/log
- name: promtail-config
mountPath: /etc/promtail
- mountPath: /var/lib/docker/containers
name: varlibdockercontainers
readOnly: true
volumes:
- name: logs
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: promtail-config
configMap:
name: promtail-config
--- # configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: promtail-config
data:
promtail.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
clients:
- url: https://{YOUR_LOKI_ENDPOINT}/loki/api/v1/push
positions:
filename: /tmp/positions.yaml
target_config:
sync_period: 10s
scrape_configs:
- job_name: pod-logs
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- docker: {}
relabel_configs:
- source_labels:
- __meta_kubernetes_pod_node_name
target_label: __host__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- action: replace
replacement: $1
separator: /
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
target_label: job
- action: replace
source_labels:
- __meta_kubernetes_namespace
target_label: namespace
- action: replace
source_labels:
- __meta_kubernetes_pod_name
target_label: pod
- action: replace
source_labels:
- __meta_kubernetes_pod_container_name
target_label: container
- replacement: /var/log/pods/*$1/*.log
separator: /
source_labels:
- __meta_kubernetes_pod_uid
- __meta_kubernetes_pod_container_name
target_label: __path__
--- # Clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: promtail-clusterrole
rules:
- apiGroups: [""]
resources:
- nodes
- services
- pods
verbs:
- get
- watch
- list
--- # ServiceAccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: promtail-serviceaccount
--- # Rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: promtail-clusterrolebinding
subjects:
- kind: ServiceAccount
name: promtail-serviceaccount
namespace: default
roleRef:
kind: ClusterRole
name: promtail-clusterrole
apiGroup: rbac.authorization.k8s.io
3. 看Log
先到Promtail的pod看有沒有錯誤,
沒有的話到grafana裡面,
如果你的grafana也是istio裡面的yaml安裝起來的話,
預設就會有loki的datasource,
不用再額外設定。
開啟grafana,開啟選單的explorer。
datasource選 Loki
一開始可以用label選擇,這邊的app是我建立服務時所用的label。
也可以用deploy或namespace選擇。
最後按下右上的Run Query。
這樣就表示有資料了。
此時,也可以按右上的Add dashboard,
套用到現有的dashboard或是建立一個都可以。